home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / archiver / lzhsourc.lzh / LZH.SRC / LHA5.S < prev    next >
Text File  |  1992-07-02  |  36KB  |  809 lines

  1.                 import flg_n                ; <> 0, wenn kein Output
  2.  
  3.                 import output_pos
  4.                 import output_mask
  5.                 import bufsiz
  6.                 import send_block
  7.                 import buf
  8.                 import c_freq
  9.                 import p_freq
  10.  
  11.                 import avail
  12.                 import next
  13.                 export childcount
  14.                 import prev
  15.                 import parent
  16.                 import level
  17.                 import position
  18.                 import pos
  19.                 export text
  20.                 import remainder
  21.                 import infile
  22.                 import _StdErrF
  23.                 import _StdOutF
  24.                 import unpackable
  25.                 import origsize
  26.                 import compsize
  27.  
  28.                 import memmove
  29.                 import memcpy
  30.                 import fread_crc
  31.                 import fputc
  32.                 import putc
  33.                 import make_crctable
  34.                 import allocate_memory
  35.                 import start_huf
  36.                 import end_huf
  37.                 import allocate_memory
  38.                 import init_slide
  39.                 import start_huf
  40.  
  41.                 export split
  42.                 export insert_node
  43.                 export delete_node
  44.                 export get_next_match
  45.                 export encode5
  46.                 export init_encode5
  47.                 export output5
  48.  
  49.  
  50. init_slide:
  51.                 move.l  A2,-(SP)
  52.                 move.w  #$2000,D0
  53.                 lea     level,A0
  54.                 lea     position,A1
  55.                 bra.b   islide2
  56. islide1:        movea.l (A0),A2
  57.                 move.b  #1,0(A2,D0.w)
  58.                 move.w  D0,D1
  59.                 ext.l   D1
  60.                 add.l   D1,D1
  61.                 movea.l (A1),A2
  62.                 clr.w   0(A2,D1.l)
  63.                 addq.w  #1,D0
  64. islide2:
  65.                 cmp.w   #$20FF,D0
  66.                 ble.b   islide1
  67.                 move.w  #$2000,D0
  68.                 lea     parent,A1
  69.                 bra.b   islide4
  70. islide3:
  71.                 move.w  D0,D1
  72.                 ext.l   D1
  73.                 add.l   D1,D1
  74.                 movea.l (A1),A0
  75.                 clr.w   0(A0,D1.l)
  76.                 addq.w  #1,D0
  77. islide4:
  78.                 cmp.w   #$4000,D0
  79.                 blt.b   islide3
  80.                 move.w  #1,avail
  81.                 moveq   #1,D0
  82.                 lea     next,A1
  83.                 bra.b   islide6
  84. islide5:
  85.                 moveq   #1,D1
  86.                 add.w   D0,D1
  87.                 move.w  D0,D2
  88.                 ext.l   D2
  89.                 add.l   D2,D2
  90.                 movea.l (A1),A0
  91.                 move.w  D1,0(A0,D2.l)
  92.                 addq.w  #1,D0
  93. islide6:
  94.                 cmp.w   #$1FFF,D0
  95.                 blt.b   islide5
  96.                 movea.l (A1),A0
  97.                 clr.w   $3FFE(A0)
  98.                 move.w  #$4000,D0
  99.                 bra.b   islide8
  100. islide7:
  101.                 move.w  D0,D1
  102.                 ext.l   D1
  103.                 add.l   D1,D1
  104.                 movea.l (A1),A0
  105.                 clr.w   0(A0,D1.l)
  106.                 addq.w  #1,D0
  107. islide8:
  108.                 cmp.w   #$70EF,D0
  109.                 ble.b   islide7
  110.                 movea.l (SP)+,A2
  111.                 rts
  112.  
  113. ; --------------------------------------; beg child
  114. slide:          moveq   #0,D2           ;
  115.                 move.b  D1,D2           ;
  116.                 lsl.w   #4,D2           ;
  117.                 add.w   D0,D2           ;
  118.                 add.w   #$4000,D2       ; h=HASH(q,c)
  119.                 ext.l   d2              ; h
  120.                 add.l   D2,D2           ; 2*h
  121.                 move.w  D0,(A2)         ; parent[NIL]=q
  122. child1:         move.w  0(A4,D2.l),D1   ; r=next[r]
  123.                 move.w  D1,D2           ; r
  124.                 ext.l   D2              ; r
  125.                 add.l   D2,D2           ; 2*r
  126.                 cmp.w   0(A2,D2.l),D0   ; while (parent[r] != NIL)
  127.                 bne.b   child1          ;
  128.                 move.w  D1,D0           ; return r
  129.                 rts                     ; end child
  130. ; --------------------------------------;
  131. makechild:      movem.l D3/d4,-(SP)
  132.                 moveq   #0,D4
  133.                 move.b  D1,D4
  134.                 lsl.w   #4,D4           ; c<<DICBIT-9
  135.                 add.w   D0,D4           ; p+c
  136.                 add.w   #$4000,D4       ; ((p)+((c)<<(DICBIT-9))+(DICSIZ*2)
  137.                 move.w  D4,D1           ; h
  138.                 ext.l   D4              ; h
  139.                 add.l   D4,D4           ; 2*h
  140.                 move.w  0(A4,D4.l),D3   ; t=next[h]
  141.                 move.w  D2,0(A4,D4.l)   ; next[h]=r
  142.                 move.w  D2,D4           ; r
  143.                 ext.l   D4              ; r
  144.                 add.l   D4,D4           ; 2*r
  145.                 move.w  D3,0(A4,D4.l)   ; next[r]=t
  146.                 ext.l   D3              ; t
  147.                 add.l   D3,D3           ; 2*t
  148.                 move.w  D2,0(A3,D3.l)   ; prev[t]=r
  149.                 move.w  D1,0(A3,D4.l)   ; prev[r]=h
  150.                 move.w  D0,0(A2,D4.l)   ; parent[r]=q
  151.                 movea.l childcount-pos(a6),A0   ;
  152.                 addq.b  #1,0(A0,D0.w)   ; childcount[q]++
  153.                 movem.l (SP)+,d3/d4
  154.                 rts
  155.  
  156.  
  157. ;».MODULE LOCAL
  158.  
  159. ; --------------------------------------;
  160. insert_node:                            ;
  161.                 cmp.w   #4,d7           ; if (matchl >= 4)
  162.                 blt     inode7          ;
  163.                 subq.w  #1,d7           ; matchl--
  164.                 moveq   #1,D4           ;
  165.                 add.w   d6,D4           ;
  166.                 or.w    #$2000,D4       ; r=(matchpos+1)|DICSIZ
  167. ; --------------------------------------;
  168.  
  169. ; --------------------------------------;
  170.                 bra.b   inode2          ; while ((q=parent[r]==NIL) {
  171. inode1:         move.w  0(A4,D0.l),D4   ;   r=next[r]
  172. inode2:         move.w  D4,D0           ;   r
  173.                 ext.l   D0              ;   r
  174.                 add.l   D0,D0           ;   r * 2
  175.                 move.w  0(A2,D0.l),D5   ;   q=parent[r]
  176.                 beq.b   inode1          ; }
  177. ; --------------------------------------;
  178.  
  179. ; --------------------------------------;
  180.                 movea.l level,A0        ;
  181.                 bra.b   inode4          ; while (level[q] >= matchl) {
  182. inode3:         move.w  D5,D4           ;   r = q
  183. ;               ext.l   D5              ;   q
  184.                 add.l   D5,D5           ;   q * 2
  185.                 move.w  0(A2,D5.w),D5   ;   q=parent[q]
  186. inode4:         moveq   #0,D0           ;
  187.                 move.b  0(A0,D5.w),D0   ;   level[q]
  188.                 cmp.w   D0,d7           ; }
  189.                 ble.b   inode3          ;
  190. ; --------------------------------------;
  191.  
  192. ; --------------------------------------;
  193.                 move.w  D5,D0           ; t = q
  194.                 movea.l position-pos(a6),A0     ; while (position[t] < 0) {
  195.                 bra.b   inode6          ;
  196. inode5:         move.w  (A6),0(A0,D0.l) ;   position[t] = pos
  197.                 move.w  0(A2,D0.l),D0   ;   t=parent[t]
  198. inode6:     ;   ext.l   D0              ;   t
  199.                 add.l   D0,D0           ;   t * 2
  200.                 move.w  0(A0,D0.l),D1   ;   position[t]
  201.                 blt.b   inode5          ; }
  202. ;    end while  ----------------------- ;
  203.                 cmp.w   #$4000,D0       ; if (t < DICSIZ) {
  204.                 bge     inode9          ;
  205.                 move.w  (A6),D2         ;   pos
  206.                 or.w    #$8000,D2       ;   pos | PERC_FLAG
  207.                 move.w  D2,0(A0,D0.l)   ;   position[t] = pos | PERC_FLAG
  208.                 bra     inode9          ;
  209. ; --------------------------------------:
  210. inode7:         move.w  (A6),D0         ; pos
  211.                 movea.l text-pos(a6),A0         ;
  212.                 moveq   #0,d5           ;
  213.                 move.b  0(A0,D0.w),D5   ; q = text[pos]
  214.                 add.w   #$2000,D5       ; + DICSIZE
  215.                 move.b  1(A0,D0.w),d7   ; c = text[pos+1]
  216.                 move.b  d7,D1           ; c
  217. ; --------------------------------------; be